/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.reporte.control;

import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import org.reporte.modelo.DatosReporte;
import org.reporte.modelo.ParametroReporte;
import org.reporte.utils.EncriptadorED;
import org.reporte.utils.JsfAyuda;

/**
 *
 * @author 43579648
 */
public class ProcesaDatosReporte {

    private Locale idioma;
    
    public ProcesaDatosReporte(Locale idiomaDesplegarMensajes) {
        idioma = idiomaDesplegarMensajes;
    }
    
    private List<DatosReporte> listaDatosReporte;
    private List<ParametroReporte> listaParametrosReportePermanente = new ArrayList<ParametroReporte>();
    private List<ParametroReporte> listaParametrosReporteDinamica= new ArrayList<ParametroReporte>();
    
    
    public void cargaDatosParametros(List<DatosReporte> listaDatosReporte){
        this.listaDatosReporte = listaDatosReporte;
        //Obteniendo la lista de parametros configurados al reporte
        for(ParametroReporte p : listaDatosReporte.get(0).getIdReporte().getParametroReporteList()){
            if(p.isPermanente()){
                listaParametrosReportePermanente.add(p);
            }else{
                listaParametrosReporteDinamica.add(p);
            }
        }
    }
    
    
    /**
     * Obtiene una entidad DatosReporte a partir del parametro ingresado
     * @param Entidad parametro del reporte
     * @return Entidad DatosReporte coincidente con el parametro
     */
    public DatosReporte obtenerDatoReporteDesdeParametro(ParametroReporte parametro){
        DatosReporte datoReporte = null;
        for(DatosReporte dato : getListaDatosReporte()){
            if(dato.getNombre().equalsIgnoreCase(parametro.getParametroReportePK().getNombre())){
                datoReporte = dato;
                break;
            }
        }
        return datoReporte;
    }
    
    /**
     * Obtiene una entidad DatosReporte a partir del parametro ingresado
     * @param String nombre del parametro definido al reporte
     * @return Entidad DatosReporte coincidente con el parametro
     */
    public DatosReporte obtenerDatoReporteDesdeParametro(String parametro){
        DatosReporte datoReporte = null;
        for(DatosReporte dato : getListaDatosReporte()){
            if(dato.getNombre().equalsIgnoreCase(parametro)){
                datoReporte = dato;
                break;
            }
        }
        return datoReporte;
    }
    
    /**
     * Obtiene una lista de entidades DatosReporte a partir 
     * de los parametros dinamicos definidos en el reporte
     * @return Lista de entidades DatosReporte coincidente con los  parametros dinamicos del reporte
     */
    public List<DatosReporte> obtenerTodosDatosReporteDinamicos(){
        List<DatosReporte> listaDatosReporteParametro = new ArrayList<DatosReporte>();
        DatosReporte d = null;
        for(ParametroReporte p : getListaParametrosReporteDinamica()){
            d = obtenerDatoReporteDesdeParametro(p);
            if(d!=null){
                listaDatosReporteParametro.add(d);
            }
        }
        return listaDatosReporteParametro;
    }
    
    /**
     * Obtiene una entidad Parametro permanente definida en los parametros reporte
     * @param String nombre parametro
     * @return Entidad ParametroReporte permanente
     */
    public ParametroReporte obtenerParametroReportePermanente(String nombreParametro) throws Exception{
        ParametroReporte parametroReporte = null;
        for(ParametroReporte p : getListaParametrosReportePermanente()){
            if(p.getParametroReportePK().getNombre().equalsIgnoreCase(nombreParametro)){
                parametroReporte = p;
                break;
            }
        }
        if(parametroReporte==null){
            throw new Exception(JsfAyuda.getPropertyValue("reporteParametroNoEncontrado",idioma).replace("{0}", nombreParametro));
        }
        return parametroReporte;
    }
    
    /**
     * Obtiene el Valor de el Parametro permanente definido en los parametros reporte
     * @param String nombre ParametroReporte
     * @return String Valor ParametroReporte permanente
     */
    public String obtenerValorParametroReportePermanente(String nombreParametro) throws Exception{
        ParametroReporte parametroReporte = null;
        String valor = null;
        for(ParametroReporte p : getListaParametrosReportePermanente()){
            if(p.getParametroReportePK().getNombre().equalsIgnoreCase(nombreParametro)){
                parametroReporte = p;
                break;
            }
        }
        if(parametroReporte!=null){
            if(parametroReporte.isEncriptarValor()){
                valor = EncriptadorED.getDesencriptar(parametroReporte.getValor());
            }else{
                valor = parametroReporte.getValor();
            }
        }else{
            throw new Exception(
                    JsfAyuda.getPropertyValue("reporteParametroNoEncontrado",idioma)
                    .replace("{0}", nombreParametro)
                    .replace("{1}", getListaDatosReporte().get(0).getIdReporte().getNombre()));
        }
        return valor;
    }

    public List<DatosReporte> getListaDatosReporte() {
        return listaDatosReporte;
    }

    public List<ParametroReporte> getListaParametrosReporteDinamica() {
        return listaParametrosReporteDinamica;
    }

    public List<ParametroReporte> getListaParametrosReportePermanente() {
        return listaParametrosReportePermanente;
    }

   
    
    
}
